package org.moonlight.redis.limit.annotation;

import java.lang.annotation.*;

/**
 * 限流注解
 * maxCount() 与 second() 结合使用，即: 某个API在 second() 秒内 最多允许请求 maxCount() 次
 * 默认是 60秒内最多允许访问6次
 * @author Moonlight
 */
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD})
public @interface AccessLimit {

    /** 限流策略 默认根据访问者IP进行限制 **/
    AccessLimitStrategy strategy() default AccessLimitStrategy.ACCESS_IP;
    /** 指定 second 时间内 API最大请求次数 **/
    int maxCount() default 5;
    /** 请求次数的指定时间范围, 单位为秒(redis数据过期时间) **/
    int second() default 60;

    /**
     * 限流策略
     * @author Moonlight
     */
    enum AccessLimitStrategy {
        /** 根据访问者IP进行限制 **/
        ACCESS_IP,
        /** 对所有的请求都进行限制 **/
        ALL_REQUEST;
    }
}